Python ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๋ฉ์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค. Istio, Linkerd, ๋ณด์, ๊ด์ธก์ฑ ๋ฐ ํธ๋ํฝ ๊ด๋ฆฌ์ ๋ํด ์์๋ณด์ธ์.
Python ๋ง์ดํฌ๋ก์๋น์ค: ์๋น์ค ๋ฉ์ ๊ตฌํ ์ฌ์ธต ๋ถ์
์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ก ์ ํ๋์์ต๋๋ค. ๋ชจ๋๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ ์๋น์ค๋ก ๋ถํ ํ๋ฉด ํ์ํ ๋ฏผ์ฒฉ์ฑ, ํ์ฅ์ฑ ๋ฐ ๋ณต์๋ ฅ์ ์ป์ ์ ์์ต๋๋ค. Python์ ๊น๋ํ ๊ตฌ๋ฌธ๊ณผ FastAPI ๋ฐ Flask์ ๊ฐ์ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ๋ฅผ ํตํด ์ด๋ฌํ ์๋น์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ด ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ถ์ฐ๋ ์ธ๊ณ์๋ ์ด๋ ค์์ด ๋ฐ๋ฆ ๋๋ค. ์๋น์ค ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๋น์ค ์ํธ ์์ฉ์ ๊ด๋ฆฌํ๋ ๋ณต์ก์ฑ๋ ์ฆ๊ฐํฉ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์๋น์ค ๋ฉ์๊ฐ ๋ฑ์ฅํฉ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ Python์ ์ฌ์ฉํ๋ ์ํํธ์จ์ด ์์ง๋์ด, DevOps ์ ๋ฌธ๊ฐ ๋ฐ ์ํคํ ํธ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์๋น์ค ๋ฉ์๊ฐ '์ข์ ๊ฒ'์ผ ๋ฟ๋ง ์๋๋ผ ๋๊ท๋ชจ๋ก ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์คํํ๋ ๋ฐ ํ์์ ์ธ ๊ตฌ์ฑ ์์์ธ ์ด์ ๋ฅผ ์ดํด๋ด ๋๋ค. ์๋น์ค ๋ฉ์๊ฐ ๋ฌด์์ธ์ง, ์ค์ํ ์ด์ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์๋ณด๊ณ Python ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์ ์๋น์ค ๋ฉ์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค์ง์ ์ธ ๋ด์ฉ์ ์ ๊ณตํฉ๋๋ค.
Python ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ฌด์์ ๋๊น? ๋น ๋ฅธ ๋ณต์ต
๋ฉ์์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ ๊ณตํต ๊ธฐ๋ฐ์ ๋ง๋ จํด ๋ณด๊ฒ ์ต๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ ๋จ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์จํ๊ฒ ๊ฒฐํฉ๋๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ ๋ ์์ ์๋น์ค๋ก ๊ตฌ์ฑ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๊ฐ ์๋น์ค๋ ์์จ์ ์ด๋ฉฐ ํน์ ๋น์ฆ๋์ค ๊ธฐ๋ฅ์ ๋ด๋นํ๊ณ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค๋ฅธ ์๋น์ค์ ํต์ ํฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก REST ๋๋ gRPC์ ๊ฐ์ API๋ฅผ ํตํด).
Python์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ด ํจ๋ฌ๋ค์์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
- ๊ฐ๋ฐ์ ๋จ์์ฑ๊ณผ ์๋: Python์ ์ฝ๊ธฐ ์ฌ์ด ๊ตฌ๋ฌธ์ ํตํด ํ์ ์๋น์ค๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ๊ณ ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
- ํ๋ถํ ์ํ๊ณ: ์น ์๋ฒ(FastAPI, Flask)์์ ๋ฐ์ดํฐ ๊ณผํ(Pandas, Scikit-learn)์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ์ํ ๊ด๋ฒ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ ๋ชจ์์ ๋๋ค.
- ์ฑ๋ฅ: Starlette ๋ฐ Pydantic์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ FastAPI์ ๊ฐ์ ์ต์ ๋น๋๊ธฐ ํ๋ ์์ํฌ๋ ๋ง์ดํฌ๋ก์๋น์ค์์ ์ผ๋ฐ์ ์ธ I/O ๋ฐ์ด๋ ์์ ์ ๋ํด NodeJS ๋ฐ Go์ ํ์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. ํ๋์ ๊ฑฐ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์๋น์ค: ์ฌ์ฉ์ ๊ณ์ ๋ฐ ์ธ์ฆ์ ๊ด๋ฆฌํฉ๋๋ค.
- ์ ํ ์๋น์ค: ์ ํ ์นดํ๋ก๊ทธ ๋ฐ ์ฌ๊ณ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ฃผ๋ฌธ ์๋น์ค: ์ ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฐฐ์ก ์๋น์ค: ๋ฐฐ์ก๋น๋ฅผ ๊ณ์ฐํ๊ณ ๋ฐฐ์ก์ ์ค๋นํฉ๋๋ค.
Python์ผ๋ก ์์ฑ๋ ์ฃผ๋ฌธ ์๋น์ค๋ ๊ณ ๊ฐ์ ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉ์ ์๋น์ค์ ํต์ ํ๊ณ ์ฌ๊ณ ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ ํ ์๋น์ค์ ํต์ ํด์ผ ํฉ๋๋ค. ์ด ํต์ ์ ๋คํธ์ํฌ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ด์ ์ด๋ฅผ ์์ญ ๋๋ ์๋ฐฑ ๊ฐ์ ์๋น์ค๋ก ๊ณฑํ๋ฉด ๋ณต์ก์ฑ์ด ํ๋ฉดํ๋๊ธฐ ์์ํฉ๋๋ค.
๋ถ์ฐ ์ํคํ ์ฒ์ ๊ณ ์ ํ ๊ณผ์
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ํต์ ํ ๋ ๋คํธ์ํฌ์ ๊ณ ์ ํ ๋ถ์์ ์ฑ์ด ๋ชจ๋ ์์๋ฉ๋๋ค. ๋ชจ๋๋ฆฌ์ค์ ๊ฐ๋จํ ํจ์ ํธ์ถ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ก ๊ฐ๋ ์ฐฌ ๋ณต์กํ ๋คํธ์ํฌ ์์ฒญ์ด ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ์ด๊ธฐ ๋ฐฐํฌ ํ์ ๋ถ๋ช ํด์ง๊ธฐ ๋๋ฌธ์ ์ข ์ข "Day 2" ์ด์ ๋ฌธ์ ๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๋คํธ์ํฌ ๋ถ์์ ์ฑ
์ฃผ๋ฌธ ์๋น์ค๊ฐ ์ ํ ์๋น์ค๋ฅผ ํธ์ถํ ๋ ์ ํ ์๋น์ค๊ฐ ์๋ตํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์์ฒญ์ด ์คํจํ ์ ์์ต๋๋ค. ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๋ค์ ์๋ํด์ผ ํ ๊น์? ๋ช ๋ฒ์ด๋? ์ด๋ค ์ง์ฐ(์ง์ ๋ฐฑ์คํ)์ผ๋ก? ์ ํ ์๋น์ค๊ฐ ์์ ํ ์ค๋จ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ณต๊ตฌ๋ ๋๊น์ง ์์ฒญ ์ ์ก์ ์ ์ ์ค๋จํด์ผ ํ ๊น์? ์ฌ์๋, ์๊ฐ ์ด๊ณผ ๋ฐ ํ๋ก ์ฐจ๋จ๊ธฐ๋ฅผ ํฌํจํ ์ด ๋ก์ง์ ๋ชจ๋ ๋คํธ์ํฌ ํธ์ถ์ ๋ํด ๋ชจ๋ ์๋น์ค์์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ์ค๋ณต๋๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ Python ๋น์ฆ๋์ค ๋ก์ง์ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
๊ด์ธก์ฑ ๊ณต๋ฐฑ
๋ชจ๋๋ฆฌ์ค์์๋ ์ฑ๋ฅ์ ์ดํดํ๋ ๊ฒ์ด ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์๋ ๋จ์ผ ์ฌ์ฉ์ ์์ฒญ์ด 5๊ฐ, 10๊ฐ ๋๋ ๊ทธ ์ด์์ ์๋น์ค๋ฅผ ํต๊ณผํ ์ ์์ต๋๋ค. ํด๋น ์์ฒญ์ด ๋๋ฆฐ ๊ฒฝ์ฐ ๋ณ๋ชฉ ํ์์ ์ด๋์ ์์ต๋๊น? ์ด์ ๋ํ ๋ต์ ์ป์ผ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํตํฉ๋ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค.
- ๋ฉํธ๋ฆญ: ๋ชจ๋ ์๋น์ค์์ ์์ฒญ ๋๊ธฐ ์๊ฐ, ์ค๋ฅ์จ ๋ฐ ํธ๋ํฝ ๋ณผ๋ฅจ(์ผ๋ช "ํฉ๊ธ ์ ํธ")๊ณผ ๊ฐ์ ๋ฉํธ๋ฆญ์ ์ผ๊ด๋๊ฒ ์์งํฉ๋๋ค.
- ๋ก๊น : ์๋ฐฑ ๊ฐ์ ์๋น์ค ์ธ์คํด์ค์ ๋ก๊ทธ๋ฅผ ์ง๊ณํ๊ณ ํน์ ์์ฒญ๊ณผ ์ฐ๊ฒฐํฉ๋๋ค.
- ๋ถ์ฐ ์ถ์ : ๋จ์ผ ์์ฒญ์ด ํฐ์นํ๋ ๋ชจ๋ ์๋น์ค๋ฅผ ๊ฐ๋ก์ง๋ฅด๋ ์ฌ์ ์ ๋ฐ๋ผ ์ ์ฒด ํธ์ถ ๊ทธ๋ํ๋ฅผ ์๊ฐํํ๊ณ ์ง์ฐ์ ์ ํํ ์ฐพ์๋ ๋๋ค.
์ด๋ฅผ ์๋์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ๋ชจ๋ Python ์๋น์ค์ ๊ด๋ฒ์ํ ๊ณ์ธก ๋ฐ ๋ชจ๋ํฐ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ ์ผ๊ด์ฑ์ด ๋จ์ด์ง๊ณ ์ ์ง ๊ด๋ฆฌ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ณด์ ๋ฏธ๋ก
์ฃผ๋ฌธ ์๋น์ค์ ์ฌ์ฉ์ ์๋น์ค ๊ฐ์ ํต์ ์ด ์์ ํ๊ณ ์ํธํ๋๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ฃผ๋ฌธ ์๋น์ค๋ง ์ ํ ์๋น์ค์ ์ค์ํ ์ฌ๊ณ ์๋ํฌ์ธํธ์ ์ก์ธ์คํ ์ ์๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๊ธฐ์กด ์ค์ ์์๋ ๋คํธ์ํฌ ์์ค ๊ท์น(๋ฐฉํ๋ฒฝ)์ ์์กดํ๊ฑฐ๋ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ํธ ๋ฐ ์ธ์ฆ ๋ก์ง์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ ๋๊ท๋ชจ๋ก ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์์ง๋๋ค. ๋ชจ๋ ์๋น์ค๊ฐ ๋ชจ๋ ํธ์ถ์ ์ธ์ฆํ๊ณ ๊ถํ์ ๋ถ์ฌํ๋ ์ ๋ก ํธ๋ฌ์คํธ ๋คํธ์ํฌ(์ํธ TLS(mTLS) ๋ฐ ์ธ๋ถํ๋ ์ก์ธ์ค ์ ์ด๋ผ๊ณ ํจ)๊ฐ ํ์ํฉ๋๋ค.
๋ณต์กํ ๋ฐฐํฌ ๋ฐ ํธ๋ํฝ ๊ด๋ฆฌ
๊ฐ๋ ์ค์ง ์๊ฐ ์์ด Python ๊ธฐ๋ฐ ์ ํ ์๋น์ค์ ์ ๋ฒ์ ์ ๋ฆด๋ฆฌ์คํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ผ๋ฐ์ ์ธ ์ ๋ต์ ๋ผ์ด๋ธ ํธ๋ํฝ์ ์์ ๋น์จ(์: 1%)์ ์ ๋ฒ์ ์ผ๋ก ์ฒ์ฒํ ๋ผ์ฐํ ํ๋ ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค์ ๋๋ค. ์ฑ๋ฅ์ด ์ข์ผ๋ฉด ํธ๋ํฝ์ ์ ์ง์ ์ผ๋ก ๋๋ฆฝ๋๋ค. ์ด๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ก๋ ๋ฐธ๋ฐ์ ๋๋ API ๊ฒ์ดํธ์จ์ด ์์ค์์ ๋ณต์กํ ๋ก์ง์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. A/B ํ ์คํธ ๋๋ ํ ์คํธ๋ฅผ ์ํด ํธ๋ํฝ์ ๋ฏธ๋ฌ๋งํ๋ ๊ฒฝ์ฐ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
์๋น์ค ๋ฉ์ ์ ๋ ฅ: ์๋น์ค๋ฅผ ์ํ ๋คํธ์ํฌ
์๋น์ค ๋ฉ์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ์ฉ ๊ตฌ์ฑ ๊ฐ๋ฅ ์ธํ๋ผ ๊ณ์ธต์ ๋๋ค. ๊ธฐ์กด ๋คํธ์ํฌ(์: Kubernetes์์ ์ ๊ณตํ๋ ๋คํธ์ํฌ) ์์ ์๋ ๋คํธ์ํน ๋ชจ๋ธ๋ก, ๋ชจ๋ ์๋น์ค ๊ฐ ํต์ ์ ๊ด๋ฆฌํฉ๋๋ค. ์ฃผ์ ๋ชฉํ๋ ์ด ํต์ ์ ์์ ์ ์ด๊ณ ์์ ํ๋ฉฐ ๊ด์ฐฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
ํต์ฌ ๊ตฌ์ฑ ์์: ์ ์ด ํ๋ฉด ๋ฐ ๋ฐ์ดํฐ ํ๋ฉด
์๋น์ค ๋ฉ์์๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ถ๋ถ์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ ํ๋ฉด: ๋ง์ดํฌ๋ก์๋น์ค์ ๊ฐ ์ธ์คํด์ค์ ํจ๊ป ๋ฐฐํฌ๋๋ ์ฌ์ด๋์นด๋ผ๋ ์ผ๋ จ์ ๊ฒฝ๋ ๋คํธ์ํฌ ํ๋ก์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด๋ฌํ ํ๋ก์๋ ์๋น์ค ๊ฐ์ ๋ชจ๋ ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๋คํธ์ํฌ ํธ๋ํฝ์ ๊ฐ๋ก์ฑ๋๋ค. ์๋น์ค๊ฐ Python์ผ๋ก ์์ฑ๋์๋ค๋ ๊ฒ์ ์๊ฑฐ๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๋คํธ์ํฌ ์์ค์์ ์๋ํฉ๋๋ค. ์๋น์ค ๋ฉ์์์ ์ฌ์ฉ๋๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ํ๋ก์๋ Envoy์ ๋๋ค.
- ์ ์ด ํ๋ฉด: ์๋น์ค ๋ฉ์์ "๋๋"์ ๋๋ค. ์ด์์์ธ ์ฌ์ฉ์๊ฐ ์ํธ ์์ฉํ๋ ๊ตฌ์ฑ ์์ ์งํฉ์ ๋๋ค. ์ ์ด ํ๋ฉด์ ๋์ ์์ค์ ๊ท์น ๋ฐ ์ ์ฑ (์: "์ ํ ์๋น์ค์ ๋ํ ์คํจํ ์์ฒญ์ ์ต๋ 3๋ฒ๊น์ง ๋ค์ ์๋")์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ์ด ํ๋ฉด์ ์ด๋ฌํ ์ ์ฑ ์ ๊ตฌ์ฑ์ผ๋ก ๋ณํํ๊ณ ๋ฐ์ดํฐ ํ๋ฉด์ ๋ชจ๋ ์ฌ์ด๋์นด ํ๋ก์๋ก ํธ์ํฉ๋๋ค.
ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋น์ค ๋ฉ์๊ฐ ๋คํธ์ํน ๋ฌธ์ ์ ๋ํ ๋ก์ง์ ๊ฐ๋ณ Python ์๋น์ค์์ ํ๋ซํผ ๊ณ์ธต์ผ๋ก ์ด๋ํฉ๋๋ค. FastAPI ๊ฐ๋ฐ์๋ ๋ ์ด์ ์ฌ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ mTLS ์ธ์ฆ์๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ์์ฑํ๋ฉด ๋ฉ์๊ฐ ๋๋จธ์ง๋ฅผ ํฌ๋ช ํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
์ด์ ์ฃผ๋ฌธ ์๋น์ค์์ ์ ํ ์๋น์ค๋ก์ ์์ฒญ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฆ ๋๋ค. ์ฃผ๋ฌธ ์๋น์ค โ ์ฃผ๋ฌธ ์๋น์ค ์ฌ์ด๋์นด โ ์ ํ ์๋น์ค ์ฌ์ด๋์นด โ ์ ํ ์๋น์ค. ์ฌ์๋, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ, ๋ฉํธ๋ฆญ ์์ง๊ณผ ๊ฐ์ ๋ชจ๋ ๋ง๋ฒ์ ์ ์ด ํ๋ฉด์์ ๊ด๋ฆฌํ๋ ๋ ๊ฐ์ ์ฌ์ด๋์นด ์ฌ์ด์์ ๋ฐ์ํฉ๋๋ค.
์๋น์ค ๋ฉ์์ ํต์ฌ ์์
์๋น์ค ๋ฉ์๊ฐ ์ ๊ณตํ๋ ์ด์ ์ ๋ค ๊ฐ์ง ์ฃผ์ ์์๋ก ๋๋์ด ๋ณด๊ฒ ์ต๋๋ค.
1. ์์ ์ฑ ๋ฐ ๋ณต์๋ ฅ
์๋น์ค ๋ฉ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ถ์ฐ ์์คํ ์ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ์๋ ์ฌ์๋: ์๋น์ค์ ๋ํ ํธ์ถ์ด ์ผ์์ ์ธ ๋คํธ์ํฌ ์ค๋ฅ๋ก ์คํจํ๋ฉด ์ฌ์ด๋์นด๋ ๊ตฌ์ฑ๋ ์ ์ฑ ์ ๋ฐ๋ผ ์์ฒญ์ ์๋์ผ๋ก ๋ค์ ์๋ํ ์ ์์ต๋๋ค.
- ์๊ฐ ์ด๊ณผ: ์ผ๊ด๋ ์๋น์ค ์์ค ์๊ฐ ์ด๊ณผ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ค์ด์คํธ๋ฆผ ์๋น์ค๊ฐ 200ms ์ด๋ด์ ์๋ตํ์ง ์์ผ๋ฉด ์์ฒญ์ด ๋น ๋ฅด๊ฒ ์คํจํ์ฌ ๋ฆฌ์์ค๊ฐ ๋ณด๋ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ํ๋ก ์ฐจ๋จ๊ธฐ: ์๋น์ค ์ธ์คํด์ค๊ฐ ์ง์์ ์ผ๋ก ์คํจํ๋ ๊ฒฝ์ฐ ์ฌ์ด๋์นด๋ ์ผ์์ ์ผ๋ก ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค(ํ๋ก ์ฐจ๋จ). ์ด๋ ๊ฒ ํ๋ฉด ๊ณ๋จ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ๋น์ ์ ์๋น์ค๊ฐ ๋ณต๊ตฌ๋ ์๊ฐ์ ํ๋ณดํ ์ ์์ต๋๋ค.
2. ์ฌ์ธต์ ์ธ ๊ด์ธก์ฑ
์ฌ์ด๋์นด ํ๋ก์๋ ํธ๋ํฝ์ ๊ด์ฐฐํ๋ ๋ฐ ์๋ฒฝํ ๊ด์ ์ ๋๋ค. ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ ํ์ธํ๋ฏ๋ก ํ๋ถํ ์๊ฒฉ ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
- ๋ฉํธ๋ฆญ: ๋ฉ์๋ ๋๊ธฐ ์๊ฐ(p50, p90, p99), ์ฑ๊ณต๋ฅ ๋ฐ ์์ฒญ ๋ณผ๋ฅจ์ ํฌํจํ์ฌ ๋ชจ๋ ํธ๋ํฝ์ ๋ํ ์์ธํ ๋ฉํธ๋ฆญ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ฉํธ๋ฆญ์ Prometheus์ ๊ฐ์ ๋๊ตฌ๋ก ์คํฌ๋ฉํ๊ณ Grafana์ ๊ฐ์ ๋์๋ณด๋์์ ์๊ฐํํ ์ ์์ต๋๋ค.
- ๋ถ์ฐ ์ถ์ : ์ฌ์ด๋์นด๋ ์๋น์ค ํธ์ถ ์ ์ฒด์์ ์ถ์ ํค๋(์: B3 ๋๋ W3C ์ถ์ ์ปจํ ์คํธ)๋ฅผ ์ฝ์ ํ๊ณ ์ ํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด Jaeger ๋๋ Zipkin๊ณผ ๊ฐ์ ์ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ ์ฒด ์ฌ์ ์ ํจ๊ป ์ฐ๊ฒฐํ์ฌ ์์คํ ๋์์ ๋ํ ์ ์ฒด ๊ทธ๋ฆผ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ก์ธ์ค ๋ก๊ทธ: Python ์ฝ๋์ ๋จ์ผ `print()` ๋ฌธ์ด ์์ด๋ ์์ค, ๋์, ๊ฒฝ๋ก, ๋๊ธฐ ์๊ฐ ๋ฐ ์๋ต ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ชจ๋ ์๋น์ค ๊ฐ ํธ์ถ์ ๋ํ ์ผ๊ด๋๊ณ ์์ธํ ๋ก๊ทธ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
Kiali์ ๊ฐ์ ๋๊ตฌ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ผ์ด๋ธ ์ข ์์ฑ ๊ทธ๋ํ๋ฅผ ์์ฑํ์ฌ ํธ๋ํฝ ํ๋ฆ๊ณผ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ํ ์๋ ์์ต๋๋ค.
3. ๋ณดํธ์ ์ธ ๋ณด์
์๋น์ค ๋ฉ์๋ ํด๋ฌ์คํฐ ๋ด์์ ์ ๋ก ํธ๋ฌ์คํธ ๋ณด์ ๋ชจ๋ธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์ํธ TLS(mTLS): ๋ฉ์๋ ๋ชจ๋ ์๋น์ค์ ์ํธํ ID(์ธ์ฆ์)๋ฅผ ์๋์ผ๋ก ๋ฐ๊ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ๊ฐ์ ๋ชจ๋ ํธ๋ํฝ์ ์ํธํํ๊ณ ์ธ์ฆํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ธ์ฆ๋์ง ์์ ์๋น์ค๊ฐ ๋ค๋ฅธ ์๋น์ค์ ํต์ ํ ์ ์๊ณ ์ ์ก ์ค์ธ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ํธํ๋ฉ๋๋ค. ์ด๋ ๊ฐ๋จํ ๊ตฌ์ฑ ํ ๊ธ๋ก ์ผค ์ ์์ต๋๋ค.
- ๊ถํ ๋ถ์ฌ ์ ์ฑ : ๊ฐ๋ ฅํ๊ณ ์ธ๋ถํ๋ ์ก์ธ์ค ์ ์ด ๊ท์น์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด "'order-service' ID๊ฐ ์๋ ์๋น์ค์ `/products` ์๋ํฌ์ธํธ์ ๋ํ `GET` ์์ฒญ์ ํ์ฉํ์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๊ฑฐ๋ถํฉ๋๋ค."๋ผ๋ ์ ์ฑ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ Python ์ฝ๋๊ฐ ์๋ ์ฌ์ด๋์นด ์์ค์์ ์ ์ฉ๋๋ฏ๋ก ํจ์ฌ ๋ ์์ ํ๊ณ ๊ฐ์ฌํ ์ ์์ต๋๋ค.
4. ์ ์ฐํ ํธ๋ํฝ ๊ด๋ฆฌ
์ด๋ ์๋น์ค ๋ฉ์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ก, ์์คํ ์ ํต๊ณผํ๋ ํธ๋ํฝ ํ๋ฆ์ ์ ํํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
- ๋์ ๋ผ์ฐํ : ํค๋, ์ฟ ํค ๋๋ ๊ธฐํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ์ ๋ผ์ฐํ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํน์ HTTP ํค๋๋ฅผ ํ์ธํ์ฌ ๋ฒ ํ ์ฌ์ฉ์๋ฅผ ์๋น์ค์ ์ ๋ฒ์ ์ผ๋ก ๋ผ์ฐํ ํฉ๋๋ค.
- ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค ๋ฐ A/B ํ ์คํธ: ํธ๋ํฝ์ ๋ฐฑ๋ถ์จ๋ก ๋ถํ ํ์ฌ ์ ๊ตํ ๋ฐฐํฌ ์ ๋ต์ ๊ตฌํํฉ๋๋ค. ์๋ฅผ ๋ค์ด Python ์๋น์ค์ `v1` ๋ฒ์ ์ผ๋ก ํธ๋ํฝ์ 90%๋ฅผ ๋ณด๋ด๊ณ ์ `v2`๋ก 10%๋ฅผ ๋ณด๋ ๋๋ค. `v2`์ ๋ํ ๋ฉํธ๋ฆญ์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ชจ๋ ๊ฒ์ด ์ ์์ด๋ฉด `v2`๊ฐ 100%๋ฅผ ์ฒ๋ฆฌํ ๋๊น์ง ํธ๋ํฝ์ ์ ์ง์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
- ์ค๋ฅ ์ฃผ์ : ์์คํ ์ ๋ณต์๋ ฅ์ ํ ์คํธํ๊ธฐ ์ํด ๋ฉ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์์ฒญ์ ๋ํด HTTP 503 ์ค๋ฅ ๋๋ ๋คํธ์ํฌ ์ง์ฐ๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์๋์ ์ผ๋ก ์ฃผ์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ค์ ์ค๋จ์ ์ผ์ผํค๊ธฐ ์ ์ ์ฝ์ ์ ์ฐพ์ ์์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋น์ค ๋ฉ์ ์ ํ: ๊ธ๋ก๋ฒ ๊ด์
์ฌ๋ฌ ๊ฐ์ง ์ฑ์ํ ์คํ ์์ค ์๋น์ค ๋ฉ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์กฐ์ง์ ์๊ตฌ ์ฌํญ, ๊ธฐ์กด ์ํ๊ณ ๋ฐ ์ด์ ์ญ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ฐ์ฅ ๋๋๋ฌ์ง ์ธ ๊ฐ์ง๋ Istio, Linkerd ๋ฐ Consul์ ๋๋ค.
Istio
- ๊ฐ์: Google, IBM ๋ฑ์ ์ง์์ ๋ฐ๋ Istio๋ ๊ฐ์ฅ ๊ธฐ๋ฅ์ด ํ๋ถํ๊ณ ๊ฐ๋ ฅํ ์๋น์ค ๋ฉ์์ ๋๋ค. ์ ํฌ์์ ๊ฒ์ฆ๋ Envoy ํ๋ก์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ์ : ํธ๋ํฝ ๊ด๋ฆฌ, ๊ฐ๋ ฅํ ๋ณด์ ์ ์ฑ ๋ฐ ํ๊ธฐ์ฐฌ ์ํ๊ณ์์ ํ์ ์ถ์ข ์ ๋ถํํ๋ ์ ์ฐ์ฑ. ๋ณต์กํ ์ํฐํ๋ผ์ด์ฆ๊ธ ๋ฐฐํฌ๋ฅผ ์ํ ์ฌ์ค์์ ํ์ค์ ๋๋ค.
- ๊ณ ๋ ค ์ฌํญ: ๊ทธ ํ์ ๋ณต์ก์ฑ์ ๋๋ฐํฉ๋๋ค. ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฅผ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ๋ฉ์์ ๋นํด ๋ฆฌ์์ค ์ค๋ฒํค๋๊ฐ ๋ ๋์ต๋๋ค.
Linkerd
- ๊ฐ์: ๋จ์์ฑ, ์ฑ๋ฅ ๋ฐ ์ด์ ์ฉ์ด์ฑ์ ์ฐ์ ์ํ๋ CNCF(ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ปดํจํ ์ฌ๋จ) ์กธ์ ํ๋ก์ ํธ์ ๋๋ค.
- ๊ฐ์ : ์ค์น ๋ฐ ์์์ด ๋งค์ฐ ์ฝ์ต๋๋ค. Rust๋ก ์์ฑ๋ ์ฌ์ฉ์ ์ง์ ๋น๋๋ ์ด๊ฒฝ๋ ํ๋ก์ ๋๋ถ์ ๋ฆฌ์์ค ๊ณต๊ฐ์ด ๋งค์ฐ ์ ์ต๋๋ค. mTLS์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌ์ฑ ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ณ ๋ ค ์ฌํญ: ๋ ๋ ๋จ์ ์ด๊ณ ์ง์ค์ ์ธ ๊ธฐ๋ฅ ์ธํธ๊ฐ ์์ต๋๋ค. ๊ด์ธก์ฑ, ์์ ์ฑ ๋ฐ ๋ณด์์ ํต์ฌ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋งค์ฐ ์ ๋ค๋ฃจ์ง๋ง Istio์ ๊ณ ๊ธ ํธ๋ํฝ ๋ผ์ฐํ ๊ธฐ๋ฅ์ด ๋ถ์กฑํฉ๋๋ค.
Consul Connect
- ๊ฐ์: Terraform ๋ฐ Vault๋ฅผ ํฌํจํ๋ ๊ด๋ฒ์ํ HashiCorp ๋๊ตฌ ์ ํ๊ตฐ์ ์ผ๋ถ์ ๋๋ค. ์ฃผ์ ์ฐจ๋ณํ ์์๋ ๋ค์ค ํ๋ซํผ ํ๊ฒฝ์ ๋ํ ์ต๊ณ ์ ์ง์์ ๋๋ค.
- ๊ฐ์ : ์ฌ๋ฌ Kubernetes ํด๋ฌ์คํฐ, ๋ค๋ฅธ ํด๋ผ์ฐ๋ ๊ณต๊ธ์, ์ฌ์ง์ด ๊ฐ์ ๋จธ์ ๋๋ ๋ฒ ์ด ๋ฉํ ์๋ฒ์ ๊ฑธ์ณ ์๋ ํ์ด๋ธ๋ฆฌ๋ ํ๊ฒฝ์ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ ๋๋ค. Consul ์๋น์ค ์นดํ๋ก๊ทธ์์ ํตํฉ์ด ์ํํฉ๋๋ค.
- ๊ณ ๋ ค ์ฌํญ: ๋ ํฐ ์ ํ์ ์ผ๋ถ์ ๋๋ค. ๋จ์ผ Kubernetes ํด๋ฌ์คํฐ์ ๋ํ ์๋น์ค ๋ฉ์๋ง ํ์ํ ๊ฒฝ์ฐ Consul์ด ํ์ํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์ ์์ต๋๋ค.
์ค์ง์ ์ธ ๊ตฌํ: ์๋น์ค ๋ฉ์์ง์ Python ๋ง์ดํฌ๋ก์๋น์ค ์ถ๊ฐ
Istio์ ๊ฐ์ ๋ฉ์์ง์ ๊ฐ๋จํ Python FastAPI ์๋น์ค๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋ ์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ํ๋ก์ธ์ค์ ์๋ฆ๋ค์์ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑฐ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
์๋๋ฆฌ์ค
FastAPI๋ฅผ ์ฌ์ฉํ์ฌ Python์ผ๋ก ์์ฑ๋ ๊ฐ๋จํ `user-service`๊ฐ ์์ต๋๋ค. ์๋ํฌ์ธํธ๋ `/users/{user_id}` ํ๋์ ๋๋ค.
1๋จ๊ณ: Python ์๋น์ค(๋ฉ์ ๊ด๋ จ ์ฝ๋ ์์)
์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ ์์ํ ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ์ ์ง๋ฉ๋๋ค. Istio, Linkerd ๋๋ Envoy์ ๋ํ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์์ต๋๋ค.
main.py:
from fastapi import FastAPI
app = FastAPI()
users_db = {
1: {"name": "Alice", "location": "Global"},
2: {"name": "Bob", "location": "International"}
}
@app.get("/users/{user_id}")
def read_user(user_id: int):
return users_db.get(user_id, {"error": "User not found"})
์ฒจ๋ถ๋ `Dockerfile`๋ ํน๋ณํ ์์ ์์ด ํ์ค์ ๋๋ค.
2๋จ๊ณ: Kubernetes ๋ฐฐํฌ
ํ์ค Kubernetes YAML์์ ์๋น์ค์ ๋ฐฐํฌ ๋ฐ ์๋น์ค๋ฅผ ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ง ์๋น์ค ๋ฉ์์ ๊ด๋ จ๋ ๊ฒ์ ์์ต๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service-v1
spec:
replicas: 1
selector:
matchLabels:
app: user-service
version: v1
template:
metadata:
labels:
app: user-service
version: v1
spec:
containers:
- name: user-service
image: your-repo/user-service:v1
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- port: 80
targetPort: 8000
3๋จ๊ณ: ์ฌ์ด๋์นด ํ๋ก์ ์ฃผ์
๋ง๋ฒ์ด ์ผ์ด๋๋ ๊ณณ์ ๋๋ค. ์๋น์ค ๋ฉ์(์: Istio)๋ฅผ Kubernetes ํด๋ฌ์คํฐ์ ์ค์นํ ํ ์๋ ์ฌ์ด๋์นด ์ฃผ์ ์ ํ์ฑํํฉ๋๋ค. Istio์ ๊ฒฝ์ฐ ๋ค์์คํ์ด์ค์ ๋ํ ์ผํ์ฑ ๋ช ๋ น์ ๋๋ค.
kubectl label namespace default istio-injection=enabled
์ด์ `kubectl apply -f your-deployment.yaml`์ ์ฌ์ฉํ์ฌ `user-service`๋ฅผ ๋ฐฐํฌํ๋ฉด Istio ์ ์ด ํ๋ฉด์ด ์์ฑ๋๊ธฐ ์ ์ ํฌ๋ ์ฌ์์ ์๋์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค. Envoy ํ๋ก์ ์ปจํ ์ด๋๋ฅผ ํฌ๋์ ์ถ๊ฐํฉ๋๋ค. ์ด์ ํฌ๋์ Python `user-service`์ `istio-proxy`์ ๋ ๊ฐ์ง ์ปจํ ์ด๋๊ฐ ์์ต๋๋ค. YAML์ ์ ํ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค.
4๋จ๊ณ: ์๋น์ค ๋ฉ์ ์ ์ฑ ์ ์ฉ
Python ์๋น์ค๋ ์ด์ ๋ฉ์์ ์ผ๋ถ์ ๋๋ค! ์ค๊ณ ๊ฐ๋ ๋ชจ๋ ํธ๋ํฝ์ด ํ๋ก์๋ฉ๋๋ค. ์ด์ ๊ฐ๋ ฅํ ์ ์ฑ ์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ค์์คํ์ด์ค์ ๋ชจ๋ ์๋น์ค์ ๋ํด ์๊ฒฉํ mTLS๋ฅผ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
peer-authentication.yaml:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
์ด ๋จ์ผํ๊ณ ๊ฐ๋จํ YAML ํ์ผ์ ์ ์ฉํ์ฌ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ์๋น์ค ๊ฐ ํต์ ์ ์ํธํํ๊ณ ์ธ์ฆํ์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์์ฒญ๋ ๋ณด์ ์น๋ฆฌ์ ๋๋ค.
์ด์ ์นด๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํํ๊ธฐ ์ํ ํธ๋ํฝ ๋ผ์ฐํ ๊ท์น์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. `user-service-v2`๊ฐ ๋ฐฐํฌ๋์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
virtual-service.yaml:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user-service
spec:
hosts:
- user-service
http:
- route:
- destination:
host: user-service
subset: v1
weight: 90
- destination:
host: user-service
subset: v2
weight: 10
์ด `VirtualService`์ ํด๋น `DestinationRule`( `v1` ๋ฐ `v2` ํ์ ์งํฉ์ ์ ์ํจ)์ ์ฌ์ฉํ์ฌ Istio์๊ฒ ์ด์ ์๋น์ค๋ก ํธ๋ํฝ์ 90%๋ฅผ ๋ณด๋ด๊ณ ์ ์๋น์ค๋ก 10%๋ฅผ ๋ณด๋ด๋๋ก ์ง์ํ์ต๋๋ค. ์ด ๋ชจ๋ ์์ ์ Python ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํธ์ถ์์๊ฒ ์์ ํ ํฌ๋ช ํ ์ธํ๋ผ ์์ค์์ ์ํ๋ฉ๋๋ค.
์๋น์ค ๋ฉ์๋ฅผ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น์? (๊ทธ๋ฆฌ๊ณ ์ธ์ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๊น์?)
์๋น์ค ๋ฉ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ๋ณดํธ์ ์ธ ์๋ฃจ์ ์ ์๋๋๋ค. ์๋น์ค๋ฅผ ์ฑํํ๋ฉด ๊ด๋ฆฌํ ๋ ๋ค๋ฅธ ์ธํ๋ผ ๊ณ์ธต์ด ์ถ๊ฐ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์๋น์ค ๋ฉ์๋ฅผ ์ฑํํ์ธ์.
- ๋ง์ดํฌ๋ก์๋น์ค์ ์๊ฐ ์ฆ๊ฐํ๊ณ (์ผ๋ฐ์ ์ผ๋ก 5~10๊ฐ ์ด์์ ์๋น์ค) ์๋น์ค ๊ฐ ์ํธ ์์ฉ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ ๋๊ณ ์์ต๋๋ค.
- Python, Go ๋ฐ Java๋ก ์์ฑ๋ ์๋น์ค์ ๋ํ ์ผ๊ด๋ ์ ์ฑ ์ ์ ์ฉํด์ผ ํ๋ ํด๋ฆฌ๊ธ๋กฏ ํ๊ฒฝ์์ ์ด์ํ๊ณ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์์ค์์ ์ถฉ์กฑํ๊ธฐ ์ด๋ ค์ด ์๊ฒฉํ ๋ณด์, ๊ด์ธก์ฑ ๋ฐ ๋ณต์๋ ฅ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค.
- ์กฐ์ง์ ๋ณ๋์ ๊ฐ๋ฐ ๋ฐ ์ด์ ํ์ด ์๊ณ ์ด์ ํ์ด ํ๋ซํผ์ ๊ด๋ฆฌํ๋ ๋์ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋๋ก ์ง์ํ๋ ค๋ ๊ฒฝ์ฐ.
- ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ , ํนํ ์๋น์ค ๋ฉ์๊ฐ ๊ฐ์ฅ ์ํํ๊ฒ ํตํฉ๋๋ Kubernetes์ ํฌ๊ฒ ํฌ์ํ๊ณ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๋์์ ๊ณ ๋ คํ์ธ์.
- ๋ชจ๋๋ฆฌ์ค๊ฐ ์๊ฑฐ๋ ์๋น์ค๊ฐ ์์์ ๋ถ๊ณผํฉ๋๋ค. ๋ฉ์์ ์ด์ ์ค๋ฒํค๋๊ฐ ์ด์ ๋ณด๋ค ํด ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- ํ์ด ์๊ณ ์๋กญ๊ณ ๋ณต์กํ ์ธํ๋ผ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐฐ์ฐ๊ณ ๊ด๋ฆฌํ ์ฉ๋์ด ๋ถ์กฑํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๋ฅํ ๊ฐ์ฅ ๋ฎ์ ๋๊ธฐ ์๊ฐ์ ์๊ตฌํ๊ณ ์ฌ์ด๋์นด ํ๋ก์์์ ์ถ๊ฐ๋ ๋ง์ดํฌ๋ก์ด ์์ค์ ์ค๋ฒํค๋๊ฐ ์ฌ์ฉ ์ฌ๋ก์ ํ์ฉ๋์ง ์์ต๋๋ค.
- ์์ ์ฑ ๋ฐ ๋ณต์๋ ฅ ์๊ตฌ ์ฌํญ์ด ๊ฐ๋จํ๊ณ ์ ์ ์ง ๊ด๋ฆฌ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ์ ํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก : Python ๋ง์ดํฌ๋ก์๋น์ค ์ง์
๋ง์ดํฌ๋ก์๋น์ค ์ฌ์ ์ ๊ฐ๋ฐ๋ก ์์๋์ง๋ง ๋น ๋ฅด๊ฒ ์ด์ ๊ณผ์ ๊ฐ ๋ฉ๋๋ค. Python ๊ธฐ๋ฐ ๋ถ์ฐ ์์คํ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋คํธ์ํน, ๋ณด์ ๋ฐ ๊ด์ธก์ฑ์ ๋ณต์ก์ฑ์ด ๊ฐ๋ฐ ํ์ ์๋ํ๊ณ ํ์ ์๋๋ฅผ ๋ฆ์ถ ์ ์์ต๋๋ค.
์๋น์ค ๋ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ถ์ํํ์ฌ ์ ์ฉ ์ธ์ด ๋ ๋ฆฝ์ ์ธํ๋ผ ๊ณ์ธต์ผ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ง์ ํด๊ฒฐํฉ๋๋ค. ์ด๋ค ์ธ์ด๋ก ์์ฑ๋์๋์ง์ ๊ด๊ณ์์ด ์๋น์ค ๊ฐ์ ํต์ ์ ์ ์ด, ๋ณดํธ ๋ฐ ๊ด์ฐฐํ๋ ํต์ผ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
Istio ๋๋ Linkerd์ ๊ฐ์ ์๋น์ค ๋ฉ์๋ฅผ ์ฑํํ๋ฉด Python ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ์ํ๋ ์ผ, ์ฆ ์ฐ์ํ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ๊ณ ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ณต์กํ๊ณ ์ํฌ์ ์ธ ๋คํธ์ํน ๋ก์ง์ ๊ตฌํํด์ผ ํ๋ ๋ถ๋ด์์ ๋ฒ์ด๋ ํ๋ซํผ์ ์์กดํ์ฌ ๋ณต์๋ ฅ, ๋ณด์ ๋ฐ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ํ์ฅ์ ๋ํด ์ง์งํ ์กฐ์ง์๊ฒ ์๋น์ค ๋ฉ์๋ ์์ ์ฑ, ๋ณด์ ๋ฐ ๊ฐ๋ฐ์ ์์ฐ์ฑ ์ธก๋ฉด์์ ๋ฐฐ๋น๊ธ์ ์ง๋ถํ๋ ์ ๋ต์ ํฌ์์ ๋๋ค.